/*
 * @Author: WeijianXu weijian.xu@unidt.com
 * @Date: 2023-05-19 11:16:07
 * @LastEditors: WeijianXu weijian.xu@unidt.com
 * @LastEditTime: 2024-05-24 10:47:51
 * @FilePath: \front-end-of-task-center\src\components\render\util.js
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
/**
 * 根据指定的键值路径 strKeys，查找对象 obj，并设置数据 data
 * @param {Object} obj 组件配置对象
 * @param {String} strKeys 需要设置的键值路径
 * @param {Any} data 数据
 */
export function setObjectValueReduce(obj, strKeys, data) {
  if (!obj || !strKeys) {
    return;
  }
  // 'list[1].id' 将解析为 ['list', '1', 'id']
  const arr = strKeys.replace(/\[(\w*)\]/g, '.$1').split('.');
  arr.reduce((pre, item, i) => {
    if (arr.length === i + 1) {
      pre[item] = data;
    } else if (pre[item] === undefined || pre[item] === null) {
      pre[item] = {};
    }
    return pre[item];
  }, obj);
}
/**
 * 根据指定的键值路径 strKeys，查找对象 obj，并获取数据 data
 * @param {Object} obj 组件配置对象
 * @param {String} strKeys 需要设置的键值路径
 * @param {Any} data 数据
 */
export function getObjectValueReduce(obj, strKeys) {
  if (!obj || !strKeys) {
    return;
  }
  // 'list[1].id' 将解析为 ['list', '1', 'id']
  const arr = strKeys.replace(/\[(\w*)\]/g, '.$1').split('.');
  let data = [];
  arr.reduce((pre, item, i) => {
    if (arr.length === i + 1) {
      data = pre[item];
    }
    return pre[item] !== undefined && pre[item] !== null ? pre[item] : {};
  }, obj);
  return data;
}

/**
 * 动态数据类型的组件，用户设置获取的数据
 * @param {Object} component 组件完整配置
 * @param {Array|Object} resp 动态数据所需要设置的数据
 * @returns
 */
export function setRespData(component, resp) {
  const { dataPath, dataConsumer } = component.__config__;
  // if (!dataPath || !dataConsumer) return
  // const respData = dataPath.split('.').reduce((pre, item) => pre[item], resp)
  // 当 dataPath 为空时， 直接取 response.data，此时的数据格式就是想要的数据
  if (!dataConsumer) return;
  let respData = resp;
  if (dataPath) {
    respData = dataPath.split(".").reduce((pre, item) => pre[item], resp);
  }

  // 将请求回来的数据，赋值到指定属性。
  // 以el-tabel为例，根据Element文档，应该将数据赋值给el-tabel的data属性，所以dataConsumer的值应为'data';
  // 此时赋值代码可写成 component[dataConsumer] = respData；
  // 但为支持更深层级的赋值（如：dataConsumer的值为'options.data'）,使用setObjectValueReduce
  setObjectValueReduce(component, dataConsumer, respData);
  /* const i = this.drawingList.findIndex(item => item.__config__.renderKey === renderKey)
  if (i > -1) this.$set(this.drawingList, i, component) */
}

function setLoading(component, val) {
  const { directives } = component;
  if (Array.isArray(directives)) {
    const t = directives.find((d) => d.name === "loading");
    if (t) t.value = val;
  }
}

/**
 *
 * @param {Object} component 组件完整配置
 * @param {Function} callback 获取数据后，组件配置更新完毕后的回调函数
 */
export function fetchData(component, callback) {
  const { dataType, method, url } = component.__config__;
  if (dataType === "dynamic" && method && url) {
    setLoading(component, true);
    this.$axios({
      method,
      url,
    }).then((resp) => {
      setLoading(component, false);
      setRespData.call(this, component, resp);
      callback && callback(component);
    });
  }
}
